#ifndef __DVEC3_H__
#define __DVEC3_H__

namespace libvec
{
  struct vec3;
  struct dvec2;
  struct dvec4;
  struct dmat3;

  struct dvec3
  {
    double x, y, z;

    dvec3();
    dvec3(vec3 v);
    dvec3(dvec4 v);
    dvec3(double value);
    dvec3(dvec2 v, double z);
    dvec3(double x, double y, double z);

    double &operator[](int index);

    dvec3 operator=(vec3 v);
    dvec3 operator=(dvec3 v);
    dvec3 operator=(dvec4 v);

    bool operator==(dvec3 v);
    bool operator!=(dvec3 v);

    dvec3 &operator+();
    dvec3 &operator-();

    dvec3 operator+(dvec3 v);
    dvec3 operator+=(dvec3 v);
    dvec3 operator-(dvec3 v);
    dvec3 operator-=(dvec3 v);
    dvec3 operator*(dmat3 m);
    dvec3 operator*=(dmat3 m);
    dvec3 operator*(double scale);
    dvec3 operator*=(double scale);
    dvec3 operator/(double scale);
    dvec3 operator/=(double scale);
  };
}

#endif /* __DVEC3_H__ */
